Skip to main content link. Accesskey S
  • Help
  • HCL Logo
  • HCL Notes and Domino Application Development wiki
  • THIS WIKI IS READ-ONLY. Individual names altered for privacy purposes.
  • HCL Forums and Blogs
  • Home
  • Product Documentation
  • Community Articles
  • Learning Center
  • API Documentation
Search
Community Articles > 日本語 - Japanese > XPages SSJS で Lotus Notes クラスのオブジェクトでのリサイクルの及ぶ範囲
  • Share Show Menu▼
  • Subscribe Show Menu▼

Recent articles by this author

JMeter で XPages アプリケーションをテストする、入門編

JMeter を初めて使う方にむけて、Domino アプリケーションや XPages アプリケーションを JMeter でテストをするための手順を最初のステップから解説します。

Eclipse Memory Analyser Tool を使用した、XPages のメモリリークの調査

Java アプリケーションのメモリリークを調査する強力なツールである Eclipse Memory Analyser Tool を使用して、XPages アプリケーションのメモリリークを調査する方法について紹介します。

XSP クライアントサイド Javascript オブジェクト関数

XPages アプリケーション開発の中で利用できる、XSP クライアントサイド Javascript オブジェクト関数について解説します。

Lotus Notes Java クラスのリサイクルとメモリ消費の検証

XPages や Java エージェントなどで Lotus Notes を操作する Lotus Notes Java クラスでは、開発者が明示的にリサイクルをして使用したオブジェクトを開放する必要があります。このリサイクルを適切に行わないことで、Java クラスの

XPages アプリケーションでの「可視(rendered)」プロパティによるパフォーマンス低下への対策

XPages アプリケーション開発で、「可視」設定ので「値の計算」はパフォーマンス低下を招く可能性があります。「可視」評価の Javascript に複雑な処理を実装する必要があるときには、そのスクリプトでパフォーマンスの低
Community articleXPages SSJS で Lotus Notes クラスのオブジェクトでのリサイクルの及ぶ範囲
Added by ~Justin Elwemarynds | Edited by ~Justin Elwemarynds on April 4, 2013 | Version 20
  • Actions Show Menu▼
expanded Abstract
collapsed Abstract
XPages や Java エージェントなどで Lotus Notes を操作する Lotus Notes Java クラスでは、使用したオブジェクトの開放をするために開発者が明示的に リサイクルをする必要があります。この recycle により開放される親子関係のオブジェクトについて示し、開発者がどのようなオブジェクトに明示的に リサイクルする必要があるかを解説します。
ShowTable of Contents
HideTable of Contents
  • 1 はじめに
  • 2 まずは実験
  • 3 解説

 

はじめに

 
XPages のサーバーサイド JavaScript で Lotus Notes クラスのオブジェクトを扱うときにはオブジェクトのリリースをしてメモリの開放に注意する必要があります。SSJS の処理の裏側では Java の動いており、不要になったオブジェクトは Java のガーベージコレクションで開放されます。しかしLotus Notes クラスのオブジェクトは Java クラスのオブジェクトの中で、Lotus Notes エンジンの C++ コードが呼ばれているため Java のガーベジレコクションの仕組みではオブジェクトの開放ができません。開発者が明示的にC++ コードで生成された Lotus Notes クラスのオブジェクトのの開放を行う必要があります。作成したクラスに対して recycle() メドッドを呼ぶことで、不要になったクラスを解放してSSJS で使用する Lotus Notes クラスを開放します。
この注意事項については、以下の技術文書で説明されています。

Why it is important to use the Recycle() method on every Java object external link

 
しかし、この文書の中で「Objects form a hierarchy. For example, recycling a parent document also recycles its children.」とあります。オブジェクトの親子関係によって、親のオブジェクトをリサイクルすれば子オブジェクトもリサイクルされるのですが、この親子関係について分かりにくい部分もあります。たとえば Lotus Notes 文書を参照するためにはアプリケーションからビューを開き、そのビューから文書を開くという操作をおこないます。このときビューのオブジェクトをリサイクルするとどうなるのでしょうか?また文書のオブジェクトをリサイクルしたときに、その文書内のアイテムのオブジェクトはどうなるのでしょう?この記事ではそのようなリサイクルをしたときの適用範囲について解説します。
 

まずは実験

まずは簡単なデータベースを作成し、XPages の SSJS で Lotus Notes クラスの操作を行ってみましょう。
サンプルのデータベースではフォームに「Subject」フィールドがあり、ノーツ ID でソートされた「ByNoteID」ビューがあるとします。ある XPage の SSJS で以下のようなスクリプトで文書の選択を行い、文書のデータを表示をしたとしましょう。

 

	// 開く文書のノーツ ID

	var db = "ABC";

	 

	// アプリケーション

	var db:NotesDatabase = session.getDatabase("nd853lab/LotusLab","SimpDisc4Recycle.nsf");
	print("db.getTitle() = " + db.getTitle());

	 
	// ビュー
	var v:NotesView = db.getView("ByNoteID");
	print("v.getName() = " + v.getName());
	 
	// ビュー内の文書エントリ
	var entry:NotesViewEntry  = v.getEntryByKey(noteID);
	print("entry.getNoteID() = " + entry.getNoteID());
	 
	// 文書エントリから文書を取得
	var doc1:NotesDocument = entry.getDocument();
	print("doc1.getNoteID() = " + doc1.getNoteID());
	 
	// ビューから文書を取得
	var doc2:NotesDocument = v.getDocumentByKey(noteID);
	print("doc2.getNoteID() = " + doc2.getNoteID());
	 
	// 文書内のアイテム
	var item:NotesItem = doc2.getFirstItem("Subject");
	print("item.getValueString() = " + item.getValueString());
	

 

 

ここでは以下のような Lotus Notes クラスが生成されています。
 
  • db Lotus ・・・ Notes アプリケーションを示す NotesDatabase のインスタンス
  • v ・・・ アプリケーション内の「ByNoteID」ビューを示す NotesView のインスタンス
  • doc1, doc2   ・・・ノーツ ID で参照された Lotus Notes 文書を示す NotesDocument のインスタンス
  • Items ・・・ Lotus Notes 文書内の「Subject」アイテムを示す NotesItem クラス。
 
上のスクリプトでの各オブジェクトの参照経路は以下になります。

 

object references in the sample code

 

ここでで定義された Lotus Notes オブジェクトで recycle() メソッドを呼んでリサイクルすると、そこから生成されたオブジェクトがどのようになるかを見てみましょう。たとえばビューのオブジェクトを以下のようにリサイクルします。

 


	v.recycle();
	

 

このあとでこれらのオブジェクトのメソッドを以下のように呼び出すスクリプトを追加します。

ここで各オブジェクトのメソッド呼び出しでエラーが発生することを想定し try { } で囲っています。エラーのときは catch(e) の pprint() が表示されます。

 


	try {

	   print("db.getTitle() = " + db.getTitle());

	} catch(e) {

	   print("db ERROR: " + e.toString());

	}

	try {

	   print("v.getName() = " + v.getName());

	} catch(e) {

	   print("v ERROR: " + e.toString());

	}

	try {

	   print("entry.getNoteID() = " + entry.getNoteID());

	} catch(e) {

	   print("entry ERROR: " + e.toString());

	}

	try {

	   print("doc1.getNoteID() = " + doc1.getNoteID());

	} catch(e) {

	   print("doc1 ERROR: " + e.toString());

	}

	try {

	   print("doc2.getNoteID() = " + doc2.getNoteID());

	} catch(e) {

	   print("doc2 ERROR: " + e.toString());

	}

	try {
	   print("item.getValueString() = " + item.getValueString());

	}  catch(e) {

	 print("item ERROR: " + e.toString());

	}
	

		

 

もしオブジェクトがリサイクルされていれば、そのオブジェクトに対するメソッドの呼び出しはエラーになります。たとえば v.recycle() を呼び出したあとでは v.getName() はエラーになります。その結果をまとめたものが以下の表になります。

 

  db.recycle() v.recycle() doc2.recycle
db:NotesDatabase Recycled *1 alive alive
v:NotesView recycled recycled alive
entry:NotesViewEntry recycled recycled alive
doc1:NotesDocument recycled alive alive
doc2:NotesDocument recycled alive recycled
item:NotesItem recycled alive recycled

 

*1 NotesDatabase クラスのオブジェクトを session.getCurrentDatabase() で取得していた場合などは、Lotus Notes アプリケーション(データベース)が開かれたままなのでリサイクルは実際に行われない。
 

解説

はじめに書いたように Lotus Notes クラスのオブジェクトで recycle() メソッドを呼んでリサイクルすると、そのオブジェクトの子オブジェクトもリサイクルされます。しかしここでの子オブジェクトとは、元のオブジェクトから取得できるオブジェクトという意味ではありません。Lotus Notes アプリケーションのデータ構造として親子関係があるかどうかが問題になります。
たとえば Lotus Notes アプリケーション(データベース)はビューや文書などすべての設計要素とデータを含んでいます。そのためビューや文書などはデータベースの子オブジェクトとなり、NotesDatabase クラスのオブジェクトのリサイクルとともにそれらのオブジェクトもリサイクルされます。同じように文書とその中のアイテム(フィールドの値)にも親子関係があり、ビューとビューに表示されるエントリにも親子関係があります。
しかし Lotus Notes アプリケーション内でビューと文書には直接の関係はありません。文書は特定のビューに紐つけられているわけではないからです。そのため NotesView クラスのオブジェクトから getDocumentByKey() メソッドで直接的に、あるいは NotesViewEntry.getDocument() で間接的に取得された NotesDocument クラスのオブジェクトは、元のビューオブジェクトがリサイクルされても生き残ることになります。

 


  • Actions Show Menu▼


expanded Attachments (0)
collapsed Attachments (0)
Edit the article to add or modify attachments.
expanded Versions (20)
collapsed Versions (20)
Version Comparison     
VersionDateChanged by              Summary of changes
This version (20)Apr 4, 2013, 6:50:12 AM~Justin Elwemarynds  
19Apr 4, 2013, 6:49:13 AM~Rebecca Minfreevitchobu  
18Apr 4, 2013, 6:48:45 AM~Rebecca Minfreevitchobu  
17Mar 18, 2013, 2:44:02 PM~Rebecca Minfreevitchobu  
16Mar 18, 2013, 2:42:44 PM~Rebecca Minfreevitchobu  
15Mar 18, 2013, 2:41:37 PM~Rebecca Minfreevitchobu  
14Mar 18, 2013, 2:39:36 PM~Rebecca Minfreevitchobu  
13Mar 17, 2013, 1:03:00 AM~Rebecca Minfreevitchobu  
12Mar 17, 2013, 1:01:22 AM~Rebecca Minfreevitchobu  
11Mar 17, 2013, 12:58:30 AM~Rebecca Minfreevitchobu  
10Mar 17, 2013, 12:56:14 AM~Rebecca Minfreevitchobu  
9Mar 17, 2013, 12:55:28 AM~Rebecca Minfreevitchobu  
8Mar 17, 2013, 12:54:48 AM~Rebecca Minfreevitchobu  
7Mar 17, 2013, 12:52:43 AM~Rebecca Minfreevitchobu  
6Mar 17, 2013, 12:51:56 AM~Rebecca Minfreevitchobu  
5Mar 17, 2013, 12:50:02 AM~Rebecca Minfreevitchobu  
4Mar 17, 2013, 12:48:25 AM~Rebecca Minfreevitchobu  
3Mar 17, 2013, 12:46:35 AM~Rebecca Minfreevitchobu  
2Mar 17, 2013, 12:45:41 AM~Rebecca Minfreevitchobu  
1Mar 17, 2013, 12:40:07 AM~Rebecca Minfreevitchobu  
expanded Comments (0)
collapsed Comments (0)
Copy and paste this wiki markup to link to this article from another article in this wiki.
Go ElsewhereStay ConnectedAbout
  • HCL Software
  • HCL Digital Solutions community
  • HCL Software support
  • BlogsDigital Solutions blog
  • Community LinkHCL Software forums and blogs
  • About HCL
  • Privacy
  • Accessibility